//
// Created by Jisam on 07/09/2024 7:56 PM.
// Solution of  d
//#pragma GCC optimize(3)
#include <bits/stdc++.h>

using namespace std;
#define endl "\n"
#define PSI pair<string,int>
#define PII pair<int,int>
#define PDI pair<double,int>
#define PDD pair<double,double>
#define VVI vector<vector<int>>
#define VI vector<int>
#define VS vector<string>
#define PQLI priority_queue<int, vector<int>, less<int>>
#define PQGI priority_queue<int, vector<int>, greater<int>>
#define code_by_jisam ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
typedef long long i64;
typedef unsigned u32;
typedef unsigned long long u64;
typedef __int128 i128;
int dx[] = {-1, 1, 0, 0, 1, 1, -1, -1,};
int dy[] = {0, 0, -1, 1, 1, -1, -1, 1,};
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

struct node {
    int p;
    int d;
};

bool compareByExpire(const node &a, const node &b) {
    return a.d < b.d;
}

void solution() {
    int N;
    cin >> N;
    vector<node> a(N);

    for (int i = 0; i < N; ++i) {
        cin >> a[i].p >> a[i].d;
    }

    sort(a.begin(), a.end(), compareByExpire);

    vector<int> dp(10001, 0);

    for (const auto &product : a) {
        for (int i = product.d; i > 0; --i) {
            dp[i] = max(dp[i], dp[max(0, i - 1)] + product.p);
        }
    }

    cout << *max_element(dp.begin(), dp.end()) << endl;

}


int main() {
    code_by_jisam;
    int T = 1;
//    cin >> T;
    while (T--) {
        solution();
    }
    return 0;
}